0%

[NPUCTF2020]ezinclude

[NPUCTF2020]ezinclude

文件包含新知识,题目第一个点看的我莫名其妙的

题解

进来就是一句username/password error,源码里有一句注释<!–md5($secret.$name)===$pass –>也是看得人不明所以,也没说是post还是get传参,本来感觉应该是一个哈希扩展攻击,但是secret的长度未知,好像也没法进行。随便输了点东西之后给了我一个名字叫Hash的cookie,就直接把md5($secret.$name)给我了???把密码换成cookie值就可以了

然后会给一个flflflflag.php,但是打开就重定向到404,所以还是用burp抓包
给了一个include $_GET[‘file’];简单测试之后,input,data等字段都给过滤了,还是没有想象中那么简单

那么现在的想法就是去包含上传文件,有两种情况,在可以访问phpinfo的情况下,疯狂上传大文件,同时在phpinfo中可以看到上传的文件在tmp目录下的文件名,条件竞争,在文件被删除之前包含进来getshell;第二种就是今天的新知识点,通过include导致PHP崩溃,上传文件不被移除,遗留在tmp目录下,这种方法的问题在于不需要条件竞争,但是文件名为PHPxxxxxx,需要爆破文件名,后来看wp知道还有一个dir.php,作用就是var_dump(scandir(/tmp));

到这里思路就很简单了,手搓一个文件上传,想办法引发PHP崩溃,去dir.php里面看上传的文件名,包含getshell

php<7.2时,include语句为php://filter/string.strip_tags/resource=/etc/passwd时可以引发PHP崩溃

坑点

文件上传不晓得咋整的,这次上传文件就着原来的脚本不能用了,报错
然后抄了一个脚本,如下形式上传文件

shell = "<?php eval($_REQUEST['a']); ?>"
url = "http://983c44af-1a5b-48e8-bf90-a3d29458e7c4.node3.buuoj.cn/flflflflag.php"
files = {'file': BytesIO(shell.encode())}
payload = "?file=php://filter/string.strip_tags/resource=/etc/passwd"
res = requests.post(url=url+payload, files=files)

原来的形式是files是一个列表,第一项是$_FILE这个全局数组的键名,第二项一个元组,内容是文件名和文件内容

又flag在phpinfo中,一开始用了一下system发现没成,查了一下disable_function发现禁用了一堆,还以为又要bypass_disable_function

参考链接

看到一个文件包含利用大全的总结,很强
https://bbs.zkaq.cn/t/3639.html